//
//  RegularExpression.m
//  regularExpression
//
//  Created by leiyan on 2017/4/19.
//  Copyright © 2017年 leiyan. All rights reserved.
//

#import "RegularExpression.h"

/**
 () 是为了提取匹配的字符串。(\s*)表示连续空格的字符串。
 []是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s*]表示空格或者*号。
 {}一般用来表示匹配的长度，比如 \s{3} 表示匹配三个空格，\s[1,3]表示匹配一到三个空格。

 表1.常用的元字符
 代码	说明
 .		匹配除换行符以外的任意字符
 \w		匹配字母或数字或下划线或汉字
 \s		匹配任意的空白符
 \d		匹配数字
 \b		匹配单词的开始或结束
 ^		匹配字符串的开始
 $		匹配字符串的结束
 表2.常用的限定符
 代码/语法	说明
 *			重复零次或更多次
 +			重复一次或更多次
 ?			重复零次或一次
 {n}		重复n次
 {n,}		重复n次或更多次
 {n,m}		重复n到m次

 */
@implementation RegularExpression
+ (void)repalceString {
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(encoding=\")[^\"]+(\")" options:0 error:&error];
    /**
     正则解析：
     OC中 "需要转义成\" 所以上述正则为  (encoding=")[^"]+(")
     拆分为3部分 (encoding=")    [^"]+   (")
     1:找到字符串为 (encoding=") ；2匹配已 " 开头的字符串，重复0次或多次；3找到字符串 "
     */
    NSString *sample = @"<xml encoding=\"abc\"></xml><xml encoding=\"def\"></xml><xml encoding=\"ttt\"></xml>";
    NSLog(@"Start:%@", sample);
    NSString *result = [regex stringByReplacingMatchesInString:sample options:0 range:NSMakeRange(0, sample.length) withTemplate:@"$1utf-8$2"];
    NSLog(@"Result:%@", result);
}
+ (void)getURLTitle {
    NSError *error;
    // http+:[^\\s]* 这个表达式是检测一个网址的。(?<=title\>).*(?=</title)截取html文章中的<title></title>中内文字的正则表达式
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=title\\>).*(?=</title)" options:0 error:&error];

    NSString *urlString = @"<meta/><link/><title>1Q84 BOOK1</title></head><body>";
    if (regex != nil) {
        NSTextCheckingResult *firstMatch = [regex firstMatchInString:urlString options:0 range:NSMakeRange(0, [urlString length])];

        if (firstMatch) {
            NSRange resultRange = [firstMatch rangeAtIndex:0];

            //从urlString当中截取数据
            NSString *result = [urlString substringWithRange:resultRange];
            //输出结果
            NSLog(@"->%@<-", result);
        }
    }
}
// 正则判断手机号码地址格式
+ (BOOL)isMobileNumber:(NSString *)mobileNum {
    /**
     * 手机号码
     * 移动：134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     * 联通：130,131,132,152,155,156,185,186
     * 电信：133,1349,153,180,189
     */
    NSString *MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
    /**
     * 中国移动：China Mobile
     * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     */
    NSString *CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
    /**
     * 中国联通：China Unicom
     * 130,131,132,152,155,156,185,186
     */
    NSString *CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
    /**
     * 中国电信：China Telecom
     * 133,1349,153,180,189
     */
    NSString *CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
    /**
     * 大陆地区固话及小灵通
     * 区号：010,020,021,022,023,024,025,027,028,029
     * 号码：七位或八位
     */
    // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
    /**
     1700”为中国电信的转售号码标识，“1705”为中国移动的转售号码标识，而“1709”则为中国联通的转售号码标识。
     1718/1719提供给了中国联通
     */
    NSString *virtualNum = @"^1(70[059]|71[89])\\d{7}$";

    NSPredicate *regexTestMobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
    NSPredicate *regexTestCm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
    NSPredicate *regexTestCu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
    NSPredicate *regexTestCt = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
    NSPredicate *regexTextVirtual = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", virtualNum];
    NSArray *regexs = @[regexTestMobile, regexTestCm, regexTestCu, regexTestCt, regexTextVirtual];

    NSUInteger type = [self phoneNumberType:mobileNum regexs:regexs];
    switch (type) {
        case 0:
            NSLog(@"is Mobile Number");
            break;
        case 1:
            NSLog(@"China Mobile");
            break;
        case 2:
            NSLog(@"China Telecom");
            break;
        case 3:
            NSLog(@"China Unicom");
            break;
        case 4:
            NSLog(@"virtual Mobile Number");
            break;
            
        default:
            NSLog(@"not Mobile Numert");
            break;
    }
    return type < regexs.count;
}
+ (NSUInteger)phoneNumberType:(NSString *)num regexs:(NSArray *)regexs {
    for (NSPredicate *predicate in regexs) {
        if ([predicate evaluateWithObject:num]) {
            return [regexs indexOfObject:predicate];
        }
    }
    return 9999;
}
@end
